package concreto.redeneural;

import java.util.ArrayList;
import java.util.List;

import comportamento.neuronio.INeuronioAbstrato;
import comportamento.neuronio.IPerceptron;
import comportamento.redeneural.ICamadaNeuralPerceptron;

import concreto.neuronio.PerceptronSimples;

public class CamadaNeuralPerceptron implements ICamadaNeuralPerceptron {

	private List<IPerceptron> perceptrons = new ArrayList<IPerceptron>();

	public void adicionarPerceptron(IPerceptron neuronio) {

		perceptrons.add(neuronio);
	}

	public void removerPerceptron(IPerceptron neuronio) {

		perceptrons.remove(neuronio);
	}

	public double[] estimular(double[] estimulos) {

		int quantidadeEstimulos = estimulos.length;
		double[] estimulacao = new double[quantidadeEstimulos];
		double[] saidas = null;

		int aux = 0;
		int saidas_aux = 0;

		for(IPerceptron n : perceptrons) {

			estimulacao[aux++] = n.estimular(estimulos);
			saidas_aux++;
		}

		saidas = new double[saidas_aux];

		for(int i = 0; i < saidas_aux; i++) {
			saidas[i] = estimulacao[i];
		}

		return saidas;
	}

	public void treinar(double[] treino, double[] saidas) {

		perceptrons.clear();

		double[] tr = treino;
		int entradas = saidas.length;

		for(int i = 0; i < entradas; i++) {
			PerceptronSimples p = new PerceptronSimples(0);
			p.selecionarFuncaoAtivacao(INeuronioAbstrato.ATIVACAO_SINAL);
			adicionarPerceptron(p);
		}

		for(int i = 0; i < entradas; i++){

			for(int j = 0; j < entradas; j++){

				IPerceptron p = perceptrons.get(j);
				p.treinar(new double[][] {tr}, new double[] {saidas[j]});
			}
		}	
	}

	/*   public void treinar(double[][] treino, double[][] saidas) {

	perceptrons.clear();

	double[][] tr = treino;
	int entradas = tr.length;

	for(int i = 0; i < entradas; i++) {
	    PerceptronSimples p = new PerceptronSimples(0);
	    p.selecionarFuncaoAtivacao(INeuronioAbstrato.ATIVACAO_SINAL);
	    adicionarPerceptron(p);
	}

	for(int i = 0; i < entradas; i++){

	    for(int j = 0; j < entradas; j++){

		IPerceptron p = perceptrons.get(j);
		p.treinar(new double[][] {tr[i]}, new double[] {saidas[i][j]});
	    }

	    double[] ss = this.estimular(tr[i]);
	    String resultado = "[";

	    for(double s : ss) {
		resultado = resultado.concat(String.valueOf(s)).concat(",");
	    }

	    resultado = resultado.substring(0, resultado.length()-1).concat("]");
	    System.out.println(resultado);

	}
    }*/


	/* (non-Javadoc)
	 * @see java.lang.Object#toString()
	 */
	@Override
	public String toString() {

		StringBuffer b = new StringBuffer("");
		int contNeuronios = 1;

		for(IPerceptron n : perceptrons) {
			b.append("\n\n[Neuronio " + (contNeuronios++) + "]\n");
			b.append(n);
		}

		return b.toString();
	}

}
